﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Generic.Contract;
using Contract.Business.Process;
using Contract.Business.Entity;
using Contract.Business.Filter;

namespace Fast.Presentation.WinForms
{
    public static class UtilidadesListas
    {
        #region Singleton
        static BPRegiaoEntrega bpRegiaoEntrega;
        static BPRegiaoEntrega processRegiaoEntrega
        {
            get
            {
                if (bpRegiaoEntrega == null)
                    bpRegiaoEntrega = new BPRegiaoEntrega();

                return bpRegiaoEntrega;
            }
        }

        static BPFuncao bpFuncao;
        static BPFuncao processFuncao
        {
            get
            {
                if (bpFuncao == null)
                    bpFuncao = new BPFuncao();

                return bpFuncao;
            }
        }

        static BPEnderecoCliente bpEnderecoCliente;
        static BPEnderecoCliente processEnderecoCliente
        {
            get
            {
                if (bpEnderecoCliente == null)
                    bpEnderecoCliente = new BPEnderecoCliente();

                return bpEnderecoCliente;
            }
        }
        #endregion

        static BPFuncionario processFuncionario;
        static BPTamanho processTamanho;
        static BPGrupo processGrupo;
        static BPSubGrupo processSubGrupo;
        static BPProduto processProduto;
        static BPTipoPagamento processTipoPagamento;
        static BPCliente processCliente;
        static List<BEFuncionario> listaMotoboys;

        public static void carregarFuncao(ComboBox cbo)
        {
            try
            {
                List<BEFuncao> lista = processFuncao.ObterTodos(new FEFuncao()).OrderBy(q => q.Descricao).ToList();

                BEFuncao selecione = new BEFuncao();
                selecione.Codigo = 0;
                selecione.Descricao = "Selecione...";

                lista.Insert(0, selecione);

                cbo.DataSource = lista;
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
            }
        }

        public static void carregarTamanho(ComboBox cbo)
        {
            try
            {
                processTamanho = new BPTamanho();
                List<BETamanho> lista = processTamanho.ObterTodos(new FETamanho()).OrderBy(q => q.Sigla).ToList();

                BETamanho selecione = new BETamanho();
                selecione.Codigo = 0;
                selecione.Sigla = "Sel...";
                selecione.Descricao = "Selecione...";

                lista.Insert(0, selecione);

                cbo.DataSource = lista;
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
            }
        }

        public static void carregarRegiaoEntrega(ComboBox cbo)
        {
            try
            {
                List<BERegiaoEntrega> lista = processRegiaoEntrega.ObterTodos(new FERegiaoEntrega()).OrderBy(q => q.Nome).ToList();

                BERegiaoEntrega selecione = new BERegiaoEntrega();
                selecione.Codigo = 0;
                selecione.Nome = "Selecione...";

                lista.Insert(0, selecione);

                cbo.DataSource = lista;
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
            }
        }

        public static void carregarTamanhoLista(List<ComboBox> listCbo)
        {
            try
            {
                processTamanho = new BPTamanho();
                List<BETamanho> lista = processTamanho.ObterTodos(new FETamanho()).OrderBy(q => q.Sigla).ToList();

                BETamanho selecione = new BETamanho();
                selecione.Codigo = 0;
                selecione.Sigla = "Sel...";
                selecione.Descricao = "Selecione...";

                lista.Insert(0, selecione);

                foreach (ComboBox cbo in listCbo)
                    cbo.DataSource = new List<BETamanho>(lista);
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
            }
        }

        public static void carregarGrupos(ComboBox cbo, ComboBox cboDois = null)
        {
            try
            {
                processGrupo = new BPGrupo();
                List<BEGrupo> lista = processGrupo.ObterTodos(new FEGrupo()).OrderBy(q => q.Descricao).ToList();

                BEGrupo selecione = new BEGrupo();
                selecione.Codigo = 0;
                selecione.Descricao = "Selecione...";

                lista.Insert(0, selecione);

                cbo.DataSource = lista;

                if (cboDois != null)
                    cboDois.DataSource = new List<BEGrupo>(lista);
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
            }
        }

        public static void carregarSubGrupo(ComboBox cbo, int codigoGrupo = 0)
        {
            try
            {
                processSubGrupo = new BPSubGrupo();
                FESubGrupo filter = new FESubGrupo();
                if (codigoGrupo > 0)
                    filter.CodigoGrupo = codigoGrupo;

                List<BESubGrupo> lista = processSubGrupo.ObterTodos(filter).OrderBy(q => q.Descricao).ToList();

                BESubGrupo selecione = new BESubGrupo();
                selecione.Codigo = 0;
                selecione.Descricao = "Selecione...";

                lista.Insert(0, selecione);

                cbo.DataSource = lista;
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
            }
        }

        public static void carregarProduto(ComboBox cbo, int codigoSubGrupo = 0)
        {
            try
            {
                processProduto = new BPProduto();
                FEProduto filter = new FEProduto();
                if (codigoSubGrupo > 0)
                    filter.CodigoSubGrupo = codigoSubGrupo;

                List<BEProduto> lista = processProduto.ObterTodos(filter).OrderBy(q => q.Descricao).ToList();

                BEProduto selecione = new BEProduto();
                selecione.Codigo = 0;
                selecione.Descricao = "Selecione...";

                lista.Insert(0, selecione);

                cbo.DataSource = lista;
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
            }
        }

        public static void carregarTipoPagamento(ComboBox cbo)
        {
            try
            {
                processTipoPagamento = new BPTipoPagamento();
                List<BETipoPagamento> lista = processTipoPagamento.ObterTodos(new FETipoPagamento()).OrderBy(q => q.Descricao).ToList();

                BETipoPagamento selecione = new BETipoPagamento();
                selecione.Codigo = 0;
                selecione.Descricao = "Selecione...";

                lista.Insert(0, selecione);

                cbo.DataSource = lista;
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
            }
        }

        public static List<BETipoPagamento> buscarPagamentosAtivos()
        {
            try
            {
                processTipoPagamento = new BPTipoPagamento();
                List<BETipoPagamento> lista = processTipoPagamento.ObterTodos(new FETipoPagamento { Ativo = true }).OrderBy(q => q.Descricao).ToList();

                return lista;
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                return new List<BETipoPagamento>();
            }
        }

        public static void carregarCliente(ComboBox cbo)
        {
            try
            {
                processCliente = new BPCliente();
                List<BECliente> lista = processCliente.ObterTodos(new FECliente()).OrderBy(q => q.Nome).ToList();

                BECliente selecione = new BECliente();
                selecione.Codigo = 0;
                selecione.Nome = "Selecione...";

                lista.Insert(0, selecione);

                cbo.DataSource = lista;
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
            }
        }

        public static List<BEFuncionario> buscarMotoboys()
        {
            try
            {
                processFuncionario = new BPFuncionario();
                listaMotoboys = new List<BEFuncionario>();
                listaMotoboys.Add(new BEFuncionario() { Codigo = 0, Nome = "Selecione" });

                listaMotoboys.AddRange(processFuncionario.ObterTodos(new FEFuncionario()
                {
                    CodigoFuncao = 3,
                    Bloqueado = false
                }).OrderBy(q => q.Nome));

                return listaMotoboys;
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                return new List<BEFuncionario>();
            }
        }

        public static void carregarEnderecosCliente(ComboBox cbo, BECliente cliente)
        {
            try
            {
                List<BEEnderecoCliente> lista = processEnderecoCliente.ObterTodos(new FEEnderecoCliente() { CodigoCliente = cliente.Codigo });
                
                cbo.DataSource = lista;
                cbo.SelectedIndex = lista.IndexOf(lista.FirstOrDefault(q => q.Principal));
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
            }
        }
    }
}
